package com.ms.teapuesto.jsf;

import com.ms.jsf.FindCrudBeanBase;
import com.ms.teapuesto.bean.EventoInfo;
import com.ms.teapuesto.bean.LigaBean;
import com.ms.teapuesto.domain.qrymapper.LigaQryMapper;
import com.ms.teapuesto.domain.viewmodel.TeApuestoRsl;
import com.ms.teapuesto.domain.viewmodel.TeApuestoFlt;
import com.ms.teapuesto.service.EventoService;
import com.ms.teapuesto.service.LigaService;
import com.ms.teapuesto.service.TeApuestoService;
import com.ms.teapuesto.util.NumberUtil;
import org.apache.commons.lang.StringUtils;
import org.joda.time.DateTime;
import org.primefaces.event.SelectEvent;
import org.primefaces.event.UnselectEvent;
import org.primefaces.model.DualListModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import javax.faces.bean.ManagedBean;
import javax.faces.event.ActionEvent;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * Created by JAVA on 21/09/2014.
 */
@ManagedBean
@Scope("session")
@Component
public class FNTeApuestoJsfBean extends FindCrudBeanBase<TeApuestoFlt, TeApuestoRsl> {

    @Autowired
    EventoService eventoService;

    @Autowired
    LigaService ligaService;

    @Autowired
    private TeApuestoService teApuestoService;

    @Autowired
    LigaQryMapper ligaQryMapper;

    private TeApuestoRsl eventoSelect;

    private List<LigaBean> cmbLigaList;

    private EventoInfo eventoInfo = new EventoInfo();

    private List<String> selectLigaList = new ArrayList<String>();

    private DualListModel<LigaBean> dlLigaList;

    private String simplePorcentaje;

    private String doblePorcentaje;

    private String golesPorcentaje;

    private BigDecimal totalApuesta;

    @Override
    public void init() {
        DateTime dt = new DateTime();
        Date fechaInicio = dt.toDate();
        Date fechaFin = dt.plusDays(3).toDate();
        filter = new TeApuestoFlt();
        filter.setFechaInicio(fechaInicio);
        filter.setFechaFin(fechaFin);
        filter.setPorcentaje(new BigDecimal(50));
        pageSufix = "TeApuesto";
        cmbLigaList = ligaQryMapper.getLigas();
    }

    @Override
    protected void onCleanAction() {
        super.onCleanAction();
        filter.setPorcentaje(new BigDecimal(50));
    }

    public void onRowCheck() {
        totalApuesta = new BigDecimal(1);
        for (TeApuestoRsl evento : resultList) {
            totalApuesta = totalApuesta.multiply(NumberUtil.nvl(evento.getProbabilidad()));
        }
    }

    public void onRowSelect(SelectEvent event) {
        totalApuesta = new BigDecimal(1);
        for (TeApuestoRsl evento : resultList) {
            if(!evento.isChecked()) return;
                totalApuesta = totalApuesta.multiply(NumberUtil.nvl(evento.getProbabilidad()));


        }
    }

    public void onRowUnselect(UnselectEvent event) {
        TeApuestoRsl[] eventoList = getSelectedRows();
        totalApuesta = new BigDecimal(1);
        for (TeApuestoRsl evento : eventoList) {
            totalApuesta = totalApuesta.multiply(NumberUtil.nvl(evento.getProbabilidad()));
        }
    }

    public void addMessage() {

        TeApuestoRsl[] teApuestoRsls=getSelectedRows();
        for(int i=0;i<teApuestoRsls.length;i++){
            eventoService.marcarFavorito(teApuestoRsls[i]);
        }


    }

    @Override

    protected void onFindAction() {
        resultList = eventoService.getEventoList(getFilter());
        double totalDobles = 0;
        double totalSimples = 0;
        double totalGoles = 0;
        int countDobles = 0;
        int countSimples = 0;
        int countGoles = 0;

        String resultFinalDoble="";
        for (TeApuestoRsl teApuestoRsl : resultList) {
            if(teApuestoRsl.getEventoBean()==null){
                LOG.error("error en "+ teApuestoRsl);
                continue;
            }
            resultFinalDoble= teApuestoRsl.getEventoBean().getResultFinalDouble();
            if (StringUtils.isBlank(resultFinalDoble)) {
                continue;
            }

            if (StringUtils.isNotBlank(teApuestoRsl.getResultDoble())) {
                countDobles++;
            }

            if (resultFinalDoble.equals(teApuestoRsl.getResultDoble())) {
                totalDobles++;
            }

            if (teApuestoRsl.getTotalGoles() != null) {
                countGoles++;
                if (teApuestoRsl.getTotalGoles().doubleValue() >= 3.0) {
                    totalGoles++;
                }
            }

            if (StringUtils.isNotBlank(teApuestoRsl.getResultSimple())) {
                countSimples++;
            }

            if (StringUtils.isNotBlank(teApuestoRsl.getResultSimple()) &&
                    teApuestoRsl.getResultFinalSimple().equals(teApuestoRsl.getResultSimple())) {
                totalSimples++;
            }

        }
        DecimalFormat df = new DecimalFormat("##.0#");
        if (countSimples == 0)
            simplePorcentaje = "-";
        else
            simplePorcentaje = df.format(totalSimples / countSimples * 100);

        if (countSimples == 0)
            doblePorcentaje = "-";
        else
            doblePorcentaje = df.format(totalDobles / countDobles * 100);

        if (countGoles == 0)
            golesPorcentaje = "-";
        else
            golesPorcentaje = df.format(totalGoles / countGoles * 100);


    }


    public void onShowDialogAction(ActionEvent event) {
        String action = getAction();
        if ("btnDescargar7Dias".equals(action)) {
            selectLigaList = new ArrayList<String>();
            dlLigaList = new DualListModel(cmbLigaList, selectLigaList);
        } else if ("btnDescargarHoy".equals(action)) {
            onDescargarHoyAction();
            return;
        } else if ("btnDescargarJugadas".equals(action)) {
            onDescargarJugadasAction();
            return;
        } else if ("btnEventoInfo".equals(action)) {
            showEventInfo();
        } else if ("btnJugada".equals(action)) {
            eventoSelect = getSelectedRow();
        } else {
            throw new IllegalArgumentException("Error en la accion <" + action + ">");
        }
        showModal();
    }

    private void showEventInfo() {
        TeApuestoRsl teApuestoRsl = getSelectedRow();
        eventoInfo = eventoService.obtenerEventoInfo(teApuestoRsl);
    }

    public void onDescargar7DiasAction() {
        ligaService.descargarFechas(dlLigaList.getTarget());
        refreshResult();
    }

    public void onDescargarHoyAction() {
        ligaService.descargarHoy();
        refreshResult();
    }

    public void onPronosticoFechaAction() {
        ligaService.descargarPredictz();
        ligaService.descargarWindrawWin();
        refreshResult();
    }

    public void onDescargarJugadasAction() {
        teApuestoService.execute();
        refreshResult();
    }

    public void onAnalizarFechaAction() {
        ligaService.analizarFechas();
        refreshResult();
    }

    public void onAsignarJugadaAction() {
        TeApuestoRsl select = getSelectedRow();
        eventoService.asignarJugada(select);
        refreshResult();
    }

    public void onCalcularResultadoAction() {
        eventoService.calcularResultados(resultList);
        refreshResult();
    }


    public List<LigaBean> getCmbLigaList() {
        return cmbLigaList;
    }

    public void setCmbLigaList(List<LigaBean> cmbLigaList) {
        this.cmbLigaList = cmbLigaList;
    }

    public DualListModel<LigaBean> getDlLigaList() {
        return dlLigaList;
    }

    public void setDlLigaList(DualListModel<LigaBean> dlLigaList) {
        this.dlLigaList = dlLigaList;
    }

    public String getSimplePorcentaje() {
        return simplePorcentaje;
    }

    public void setSimplePorcentaje(String simplePorcentaje) {
        this.simplePorcentaje = simplePorcentaje;
    }

    public String getDoblePorcentaje() {
        return doblePorcentaje;
    }

    public void setDoblePorcentaje(String doblePorcentaje) {
        this.doblePorcentaje = doblePorcentaje;
    }

    public EventoService getEventoService() {
        return eventoService;
    }

    public void setEventoService(EventoService eventoService) {
        this.eventoService = eventoService;
    }

    public LigaService getLigaService() {
        return ligaService;
    }

    public void setLigaService(LigaService ligaService) {
        this.ligaService = ligaService;
    }

    public LigaQryMapper getLigaQryMapper() {
        return ligaQryMapper;
    }

    public void setLigaQryMapper(LigaQryMapper ligaQryMapper) {
        this.ligaQryMapper = ligaQryMapper;
    }

    public EventoInfo getEventoInfo() {
        return eventoInfo;
    }

    public void setEventoInfo(EventoInfo eventoInfo) {
        this.eventoInfo = eventoInfo;
    }

    public String getGolesPorcentaje() {
        return golesPorcentaje;
    }

    public void setGolesPorcentaje(String golesPorcentaje) {
        this.golesPorcentaje = golesPorcentaje;
    }

    public TeApuestoRsl getEventoSelect() {
        return eventoSelect;
    }

    public void setEventoSelect(TeApuestoRsl eventoSelect) {
        this.eventoSelect = eventoSelect;
    }

    public BigDecimal getTotalApuesta() {
        return totalApuesta;
    }

    public void setTotalApuesta(BigDecimal totalApuesta) {
        this.totalApuesta = totalApuesta;
    }

    public List<String> getSelectLigaList() {
        return selectLigaList;
    }

    public void setSelectLigaList(List<String> selectLigaList) {
        this.selectLigaList = selectLigaList;
    }
}
